package 集合;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

import java.io.*;
import java.nio.file.*;
//下面我们做一个试验，有一个User类，只重写equals()方法，然后放到Set集合中去重。
public class test {

	public static void main(String[] args) {
		Path p1 = Paths.get(".", "project", "study"); // 构造一个Path对象 .\project\study
      System.out.println(p1);
      Path p2 = p1.toAbsolutePath(); // 转换为绝对路径
      System.out.println(p2);
      Path p3 = p2.normalize(); // 转换为规范路径
      System.out.println(p3);
      File f = p3.toFile(); // 转换为File对象
      System.out.println(f);
      for (Path p : Paths.get("..").toAbsolutePath()) { // 可以直接遍历Path
          System.out.println("  " + p);
      }
//		System.out.printf("数组长度不-1：{%d}%n", 16 & "郭德纲".hashCode());
//		System.out.printf("数组长度不-1：{%d}%n", 16 & "彭于晏".hashCode());
//		System.out.printf("数组长度不-1：{%d}%n", 16 & "李小龙".hashCode());
//		System.out.printf("数组长度不-1：{%d}%n", 16 & "蔡徐鸡".hashCode());
//		System.out.printf("数组长度不-1：{%d}%n", 16 & "唱跳rap篮球鸡叫".hashCode());
//		System.out.printf("数组长度-1但是不进行异或和>>>16运算：{%d}%n", 15 & "郭德纲".hashCode());
//		System.out.printf("数组长度-1但是不进行异或和>>>16运算：{%d}%n", 15 & "彭于晏".hashCode());
//		System.out.printf("数组长度-1但是不进行异或和>>>16运算：{%d}%n", 15 & "李小龙".hashCode());
//		System.out.printf("数组长度-1但是不进行异或和>>>16运算：{%d}%n", 15 & "蔡徐鸡".hashCode());
//		System.out.printf("数组长度-1但是不进行异或和>>>16运算：{%d}%n", 15 & "唱跳rap篮球鸡叫".hashCode());
//
//		System.out.printf("数组长度-1并且进行异或和>>>16运算：{%d}%n", 15 & ("郭德纲".hashCode() ^ ("郭德纲".hashCode() >>> 16)));
//		System.out.printf("数组长度-1并且进行异或和>>>16运算：{%d}%n", 15 & ("彭于晏".hashCode() ^ ("彭于晏".hashCode() >>> 16)));
//		System.out.printf("数组长度-1并且进行异或和>>>16运算：{%d}%n", 15 & ("李小龙".hashCode() ^ ("李小龙".hashCode() >>> 16)));
//		System.out.printf("数组长度-1并且进行异或和>>>16运算：{%d}%n", 15 & ("蔡徐鸡".hashCode() ^ ("蔡徐鸡".hashCode() >>> 16)));
//		System.out.printf("数组长度-1并且进行异或和>>>16运算：{%d}%n", 15 & ("唱跳rap篮球鸡叫".hashCode() ^ ("唱跳rap篮球鸡叫".hashCode() >>> 16)));

//	然后我们循环创建10个成员变量的值都是一样的User对象，最后放到Set集合中去重。
		List<User1> list = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			User1 user = new User1("1", "张三", 18);
			list.add(user);
		}
		Set<User1> set = new HashSet<>(list);//如果仅改写equals,未改写hashCode,不能去重
		for (User1 user : set) {
			System.out.println(user);
		}
		List<User1> users = list.stream().distinct().collect(Collectors.toList());
		System.out.println(users);
	}
}
class User1 {

	private String id;

	private String name;

	private Integer age;

	public User1(String id, String name, Integer age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;
		User1 user = (User1) o;
		return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(age, user.age);
	}

	// getter、setter、toString方法
	// 重写hashCode方法
	@Override
	public int hashCode() {//如果未改写hashCode,按道理我们预期会去重，只剩下一个“张三”的user，但实际上因为没有重写hashCode方法，所以没有去重。
		return Objects.hash(id, name, age);
	}
}		

